home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0693 / IO.PAS < prev    next >
Pascal/Delphi Source File  |  1993-06-30  |  13KB  |  494 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 360 of 375                                                               
  3. From : Steve Gabrilowitz                   1:363/1701.0         30 May 93  01:25 
  4. To   : Simon Williamson                                                          
  5. Subj : PASCAL AND FOSSIL DRIV                                                 
  6. ────────────────────────────────────────────────────────────────────────────────
  7.  
  8. In a message to Steve Gabrilowitz <05-26-93 18:37> Simon Williamson wrote:
  9.  
  10. SW>   > SW>  I was wondering if anyone had any routines they could send me
  11. SW>   > or tell
  12. SW>   > SW>  me where to find some routines that show you have to use the
  13. SW>   > fossil
  14. SW>   > I have a file on my BBS called TPIO_100.ZIP, I think it's just what
  15. SW>   > you're  looking for!
  16. SW>  Sounds good. One Problem! Your In USA and im in AUstralia! ANy chance
  17. SW>  of attaching it to a message or is it too large? WIll have a look
  18.  
  19. It's not all that large, I guess I can put it into a message:}
  20.  
  21. Unit IO;
  22.  
  23.               { FOSSIL communications I/O routines }
  24.               { Turbo Pascal Version by Tony Hsieh }
  25.  
  26.   {}{}{}{ Copyright (c) 1989 by Tony Hsieh, All Rights Reserved. }{}{}{}
  27.  
  28.  
  29. { The following routines are basic input/output routines, using a }
  30. { fossil driver.  These are NOT all the routines that a fossil    }
  31. { driver can do!  These are just a portion of the functions that  }
  32. { fossil drivers can do.  However, these are the only ones most   }
  33. { people will need.  I highly recommend for those that use this   }
  34. { to download an arced copy of the X00.SYS driver.  In the arc    }
  35. { is a file called "FOSSIL.DOC", which is where I derived my      }
  36. { routines from.  If there are any routines that you see are not  }
  37. { implemented here, use FOSSIL.DOC to add/make your own!  I've    }
  38. { listed enough examples here for you to figure out how to do it  }
  39. { yourself.                                                       }
  40. { This file was written as a unit for Turbo Pascal v4.0.  You     }
  41. { should compile it to DISK, and then in your own program type    }
  42. { this right after your program heading (before Vars and Types)   }
  43. { this: "uses IO;"                                                }
  44. { EXAMPLE: }
  45. {
  46.  
  47. Program Communications;
  48.  
  49. uses IO;
  50.  
  51. begin
  52.   InitializeDriver;
  53.   Writeln ('Driver is initalized!');
  54.   ModemSettings (1200,8,'N',1); Baud := 1200;
  55.   DTR (0); Delay (1000); DTR (1);
  56.   Writeln ('DTR is now true!');
  57.   CloseDriver;
  58.   Writeln ('Driver is closed!');
  59. end.
  60.  
  61. }
  62.  
  63. { Feel free to use these routines in your programs; copy this  }
  64. { file freely, but PLEASE DO NOT MODIFY IT.  If you do use     }
  65. { these routines in your program, please give proper credit to }
  66. { the author.                                                  }
  67. {                                                              }
  68. { Thanks, and enjoy!                                           }
  69. {                                                              }
  70. { Tony Hsieh                                                   }
  71.  
  72.  
  73.  
  74.  
  75. INTERFACE
  76.  
  77. uses DOS;
  78.                                        { These are communications routines }
  79.                                        { that utilize a FOSSIL driver.  A  }
  80.                                        { FOSSIL driver MUST be installed,  }
  81.                                        { such as X00.SYS and OPUS!COM...   }
  82.  
  83. type
  84.   String255 = String [255];
  85.  
  86. var
  87.   Port: Integer;                 { I decided to make 'Port' a global    }
  88.                                  { variable to make life easier.        }
  89.  
  90.   Baud: Word;                    { Same with Baud                       }
  91.  
  92.   RegistersRecord: Registers;    { DOS registers AX, BX, CX, DX, and Flags }
  93.  
  94.  
  95. procedure BlankRegisters;
  96. procedure ModemSettings (Baud, DataBits: Integer; Parity: Char;
  97.                          Stopbits: Integer);
  98. procedure InitializeDriver;
  99. procedure CloseDriver;
  100. procedure ReadKeyAhead (var First, Second: Char);
  101. function ReceiveAhead (var Character: CHAR): Boolean;
  102. function Online: boolean;
  103. procedure DTR (DTRState: Integer);
  104. procedure Reboot;
  105. procedure BiosScreenWrite (Character: CHAR);
  106. procedure WatchDog (INPUT: Boolean);
  107. procedure WhereCursor (var Row: Integer; var Column: Integer);
  108. procedure MoveCursor (Row: Integer; Column: Integer);
  109. procedure KillInputBuffer;
  110. procedure KillOutputBuffer;
  111. procedure FlushOutput;
  112. function InputAvailable: Boolean;
  113. function OutputOkay: Boolean;
  114. procedure ReceiveCharacter (var Character: CHAR);
  115. procedure TransmitCharacter (Character: CHAR; var Status: Integer);
  116. procedure FlowControl (Control: Boolean);
  117. procedure CharacterOut (Character: CHAR);
  118. procedure StringOut (Message: String255);
  119. procedure LineOut (Message: String255);
  120. procedure CrOut;
  121.  
  122.  
  123. IMPLEMENTATION
  124.  
  125. procedure BlankRegisters;
  126. begin
  127.   Fillchar (RegistersRecord, SizeOf (RegistersRecord), 0);
  128. end;
  129.  
  130. procedure ModemSettings (Baud, DataBits: Integer; Parity: Char;
  131.                          StopBits: Integer);
  132.                                                { Do this after initializing }
  133.                                                { the FOSSIL driver and also }
  134.                                                { when somebody logs on      }
  135. var
  136.   GoingOut: Integer;
  137. begin
  138.   GoingOut := 0;
  139.   Case Baud of
  140.       0 : Exit;
  141.     100 : GoingOut := GoingOut + 000 + 00 + 00;
  142.     150 : GoingOut := GoingOut + 000 + 00 + 32;
  143.     300 : GoingOut := GoingOut + 000 + 64 + 00;
  144.     600 : GoingOut := GoingOut + 000 + 64 + 32;
  145.     1200: GoingOut := GoingOut + 128 + 00 + 00;
  146.     2400: GoingOut := GoingOut + 128 + 00 + 32;
  147.     4800: GoingOut := GoingOut + 128 + 64 + 00;
  148.     9600: GoingOut := GoingOut + 128 + 64 + 32;
  149.   end;
  150.   Case DataBits of
  151.     5: GoingOut := GoingOut + 0 + 0;
  152.     6: GoingOut := GoingOut + 0 + 1;
  153.     7: GoingOut := GoingOut + 2 + 0;
  154.     8: GoingOut := GoingOut + 2 + 1;
  155.   end;
  156.   Case Parity of
  157.     'N'    : GoingOut := GoingOut + 00 + 0;
  158.     'O','o': GoingOut := GoingOut + 00 + 8;
  159.     'n'    : GoingOut := GoingOut + 16 + 0;
  160.     'E','e': GoingOut := GoingOut + 16 + 8;
  161.   end;
  162.   Case StopBits of
  163.     1: GoingOut := GoingOut + 0;
  164.     2: GoingOut := GoingOut + 4;
  165.   end;
  166.   BlankRegisters;
  167.   With RegistersRecord do
  168.   begin
  169.     AH := 0; AL := GoingOut;
  170.     DX := (Port);
  171.     Intr ($14, RegistersRecord);
  172.   end;
  173. end;
  174.  
  175. procedure InitializeDriver;                         { Do this before doing }
  176. begin                                               { any IO routines!!!   }
  177.   BlankRegisters;
  178.   With RegistersRecord do
  179.   begin
  180.     AH := 4;
  181.     DX := (Port);
  182.     Intr ($14, RegistersRecord);
  183.     If AX <> $1954 then
  184.     begin
  185.       Writeln ('* FOSSIL DRIVER NOT RESPONDING!  OPERATION HALTED!');
  186.       halt (1);
  187.     end;
  188.   end;
  189. end;
  190.  
  191. procedure CloseDriver;  { Run this after all I/O routines are done with }
  192. begin
  193.   BlankRegisters;
  194.   With RegistersRecord do
  195.   begin
  196.     AH := 5;
  197.     DX := (Port);
  198.     Intr ($14, RegistersRecord);
  199.   end;
  200.   BlankRegisters;
  201. end;
  202.  
  203. procedure ReadKeyAhead (var First, Second: Char); { This procedure is via  }
  204.                                                   { the FOSSIL driver, not }
  205.                                                   { DOS!                   }
  206. begin
  207.   BlankRegisters;
  208.   With RegistersRecord do
  209.   begin
  210.     AH := $0D;
  211.     Intr ($14,RegistersRecord);
  212.     First := chr(lo(AX));
  213.     Second := chr(hi(AX));
  214.   end;
  215. end;
  216.  
  217. function ReceiveAhead (var Character: CHAR): Boolean;  { Non-destructive }
  218. begin
  219.   If Baud=0 then exit;
  220.   BlankRegisters;
  221.   With RegistersRecord do
  222.   begin
  223.     AH := $0C;
  224.     DX := Port;
  225.     Intr ($14,RegistersRecord);
  226.     Character := CHR (AL);
  227.     ReceiveAhead := AX <> $FFFF;
  228.   end;
  229. end;
  230.  
  231. function OnLine: Boolean;
  232. begin
  233.   BlankRegisters;
  234.   With RegistersRecord do
  235.   begin
  236.     AH := 3;
  237.     DX := (Port);
  238.     Intr ($14, RegistersRecord);
  239.     OnLine := ((AL AND 128) = 128);
  240.   end;
  241. end;
  242.  
  243. procedure DTR (DTRState: Integer);    { 1=ON, 0=OFF }
  244.                                       { Be sure that the modem dip switches }
  245.                                       { are set properly... when DTR is off }
  246.                                       { it usually drops carrier if online  }
  247. begin
  248.   BlankRegisters;
  249.   With RegistersRecord do
  250.   begin
  251.     AH := 6;
  252.     DX := (Port);
  253.     AL := DTRState;
  254.     Intr ($14, RegistersRecord);
  255.   end;
  256. end;
  257.  
  258. procedure Reboot;                  { For EXTREME emergencies... Hmmm... }
  259. begin
  260.   BlankRegisters;
  261.   With RegistersRecord do
  262.   begin
  263.     AH := 23;
  264.     AL := 1;
  265.     Intr ($14, RegistersRecord);
  266.   end;
  267. end;
  268.  
  269. {       This is ANSI Screen Write via Fossil Driver }
  270. {
  271. procedure ANSIScreenWrite (Character: CHAR);
  272. begin
  273.   BlankRegisters;
  274.   With RegistersRecord do
  275.   begin
  276.     AH := 19;
  277.     AL := ORD (Character);
  278.     Intr ($14, RegistersRecord);
  279.   end;
  280. end;
  281. }
  282.  
  283. { This is ANSI Screen Write via DOS! }
  284.  
  285. procedure ANSIScreenWrite (Character: CHAR);
  286. begin
  287.   BlankRegisters;
  288.   With RegistersRecord do
  289.   begin
  290.     AH := 2;
  291.     DL := ORD (Character);
  292.     Intr ($21, RegistersRecord);
  293.   end;
  294. end;
  295.  
  296.  
  297. procedure BIOSScreenWrite (Character: CHAR); { Through the FOSSIL driver }
  298. begin
  299.   BlankRegisters;
  300.   With RegistersRecord do
  301.   begin
  302.     AH := 21;
  303.     AL := ORD (Character);
  304.     Intr ($14, RegistersRecord);
  305.   end;
  306. end;
  307.  
  308. procedure WatchDog (INPUT: Boolean);
  309. begin
  310.   BlankRegisters;
  311.   With RegistersRecord do
  312.   begin
  313.     AH := 20;
  314.     DX := Port;
  315.     Case INPUT of
  316.       TRUE:  AL := 1;
  317.       FALSE: AL := 0;
  318.     end;
  319.     Intr ($14, RegistersRecord);
  320.   end;
  321. end;
  322.  
  323. procedure WhereCursor (var Row: Integer; var Column: Integer);
  324. begin
  325.   BlankRegisters;
  326.   With RegistersRecord do
  327.   begin
  328.     AH := 18;
  329.     Intr ($14, RegistersRecord);
  330.     Row := DH;
  331.     Column := DL;
  332.   end;
  333. end;
  334.  
  335. procedure MoveCursor (Row: Integer; Column: Integer);
  336. begin
  337.   BlankRegisters;
  338.   With RegistersRecord do
  339.   begin
  340.     AH := 17;
  341.     DH := Row;
  342.     DL := Column;
  343.     Intr ($14, RegistersRecord);
  344.   end;
  345. end;
  346.  
  347. procedure KillInputBuffer;   { Kills all remaining input that has not been }
  348.                              { read in yet }
  349. begin
  350.   If Baud=0 then exit;
  351.   BlankRegisters;
  352.   With RegistersRecord do
  353.   begin
  354.     AH := 10;
  355.     DX := Port;
  356.     Intr ($14, RegistersRecord);
  357.   end;
  358. end;
  359.  
  360. procedure KillOutputBuffer;  { Kills all pending output that has not been }
  361.                              { send yet }
  362. begin
  363.   If Baud=0 then exit;
  364.   BlankRegisters;
  365.   With RegistersRecord do
  366.   begin
  367.     AH := 9;
  368.     DX := Port;
  369.     Intr ($14, RegistersRecord);
  370.   end;
  371. end;
  372.  
  373. procedure FlushOutput;       { Flushes the output buffer }
  374. begin
  375.   If Baud=0 then exit;
  376.   BlankRegisters;
  377.   With RegistersRecord do
  378.   begin
  379.     AH := 8;
  380.     DX := Port;
  381.     Intr ($14, RegistersRecord);
  382.   end;
  383. end;
  384.  
  385. function InputAvailable: Boolean;   { Returns true if there's input }
  386.                                     { from the modem.               }
  387. begin
  388.   InputAvailable := False;
  389.   If Baud=0 then exit;
  390.   BlankRegisters;
  391.   With RegistersRecord do
  392.   begin
  393.     AH := 3;
  394.     DX := Port;
  395.     Intr ($14, RegistersRecord);
  396.     InputAvailable := ((AH AND 1) = 1);
  397.   end;
  398. end;
  399.  
  400. function OutputOkay: Boolean;     { Returns true if output buffer isn't full }
  401. begin
  402.   OutputOkay := True;
  403.   If Baud=0 then exit;
  404.   BlankRegisters;
  405.   With RegistersRecord do
  406.   begin
  407.     AH := 3;
  408.     DX := Port;
  409.     Intr ($14, RegistersRecord);
  410.     OutputOkay := ((AH AND 32) = 32);
  411.   end;
  412. end;
  413.  
  414. procedure ReceiveCharacter (var Character: CHAR);   { Takes a character }
  415.                                                     { out of the input  }
  416.                                                     { buffer }
  417. begin
  418.   Character := #0;
  419.   BlankRegisters;
  420.   With RegistersRecord do
  421.   begin
  422.     AH := 2;
  423.     DX := Port;
  424.     Intr ($14, RegistersRecord);
  425.     Character := CHR (AL);
  426.   end;
  427. end;
  428.  
  429. procedure TransmitCharacter (Character: CHAR; var Status: Integer);
  430. begin
  431.   BlankRegisters;
  432.   With RegistersRecord do
  433.   begin
  434.     AH := 1;
  435.     DX := Port;
  436.     AL := ORD (Character);
  437.     Intr ($14, RegistersRecord);
  438.     Status := AX;        { Refer to FOSSIL.DOC about the STATUS var }
  439.   end;
  440. end;
  441.  
  442. procedure FlowControl (Control: Boolean);
  443. begin
  444.   BlankRegisters;
  445.   With RegistersRecord do
  446.   begin
  447.     AH := 15;
  448.     DX := Port;
  449.     Case Control of
  450.   TRUE:  AL := 255;
  451.   FALSE: AL := 0;
  452.     end;
  453.     Intr ($14, RegistersRecord);
  454.   end;
  455. end;
  456.  
  457. procedure CharacterOut (Character: CHAR);
  458. var
  459.   Status: INTEGER;
  460. begin
  461.   { If SNOOP is on then }
  462.     ANSIScreenWrite (Character);
  463.   TransmitCharacter (Character, Status);
  464. end;
  465.  
  466. procedure StringOut (Message: String255);
  467. var
  468.   CharPos: Byte;
  469. begin
  470.   CharPos := 0;
  471.   If Length(Message) <> 0 then
  472.   begin
  473.     Repeat
  474.       If NOT Online then exit;
  475.       CharPos := CharPos + 1;
  476.       CharacterOut (Message [CharPos]);
  477.     Until CharPos = Length (Message);
  478.   end;
  479. end;
  480.  
  481. procedure LineOut (Message: String255);
  482. begin
  483.   StringOut (Message);
  484.   CharacterOut (#13);
  485.   CharacterOut (#10);
  486. end;
  487.  
  488. procedure CrOut; { Outputs a carriage return and a line feed }
  489. begin
  490.   CharacterOut (#13);
  491.   CharacterOut (#10);
  492. end;
  493.  
  494. end.